﻿using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;
using System.Web;
using System.Linq;

namespace NetCoreClass
{
	/// <summary>
	/// DESEncryptor 的摘要说明。
	/// </summary>
	public class DESEncryptor
	{
		#region 私有成员
		/// <summary>
		/// 输入字符串
		/// </summary>
		private string inputString=null;
		/// <summary>
		/// 输出字符串
		/// </summary>
		private string outString=null;
		/// <summary>
		/// 输入文件路径
		/// </summary>
		private string inputFilePath=null;
		/// <summary>
		/// 输出文件路径
		/// </summary>
		private string outFilePath=null;
		/// <summary>
		/// 加密密钥
		/// </summary>
		private string encryptKey=null;
		/// <summary>
		/// 解密密钥
		/// </summary>
		private string decryptKey=null;
		/// <summary>
		/// 提示信息
		/// </summary>
		private string noteMessage=null;
		#endregion
		#region 公共属性
		/// <summary>
		/// 输入字符串
		/// </summary>
		public string InputString
		{
			get{return inputString;}
			set{inputString=value;}
		}
		/// <summary>
		/// 输出字符串
		/// </summary>
		public string OutString
		{
			get{return outString;}
			set{outString=value;}
		}
		/// <summary>
		/// 输入文件路径
		/// </summary>
		public string InputFilePath
		{
			get{return inputFilePath;}
			set{inputFilePath=value;}
		}
		/// <summary>
		/// 输出文件路径
		/// </summary>
		public string OutFilePath
		{
			get{return outFilePath;}
			set{outFilePath=value;}
		}
		/// <summary>
		/// 加密密钥
		/// </summary>
		public string EncryptKey
		{
			get{return encryptKey;}
			set{encryptKey=value;}
		}
		/// <summary>
		/// 解密密钥
		/// </summary>
		public string DecryptKey
		{
			get{return decryptKey;}
			set{decryptKey=value;}
		}
		/// <summary>
		/// 错误信息
		/// </summary>
		public string NoteMessage
		{
			get{return noteMessage;}
			set{noteMessage=value;}
		}
		#endregion
		#region 构造函数
		public DESEncryptor()
		{
			//
			// TODO: 在此处添加构造函数逻辑
			//
		}
		#endregion
		#region DES加密字符串
		/// <summary>
		/// 加密字符串
		/// 注意:密钥必须为８位
		/// </summary>
		/// <param name="strText">字符串</param>
		/// <param name="encryptKey">密钥</param>
		public void DesEncrypt()
		{
			byte[] byKey=null; 
			byte[] IV= {0x35, 0xa1, 0x56, 0x23, 0x90, 0xAB, 0xCD, 0xEF};
			try
			{
				byKey = System.Text.Encoding.UTF8.GetBytes(this.encryptKey.Substring(0,8));
				DESCryptoServiceProvider des = new DESCryptoServiceProvider();
				byte[] inputByteArray = Encoding.UTF8.GetBytes(this.inputString);
				MemoryStream ms = new MemoryStream();
				CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write) ;
				cs.Write(inputByteArray, 0, inputByteArray.Length);
				cs.FlushFinalBlock();
				this.outString=Convert.ToBase64String(ms.ToArray());
               // this.outString=System.Text.Encoding.Default.GetString(ms.ToArray());
				

			}
			catch(System.Exception error)
			{
				this.noteMessage=error.Message;
			}
		}
		#endregion
		#region DES解密字符串
		/// <summary>
		/// 解密字符串
		/// </summary>
		/// <param name="this.inputString">加了密的字符串</param>
		/// <param name="decryptKey">密钥</param>
		public void DesDecrypt()
		{
			byte[] byKey = null; 
			byte[] IV= {0x35, 0xa1, 0x56, 0x23, 0x90, 0xAB, 0xCD, 0xEF};
			byte[] inputByteArray = new Byte[this.inputString.Length];
			try
			{
				byKey = System.Text.Encoding.UTF8.GetBytes(decryptKey.Substring(0,8));
				DESCryptoServiceProvider des = new DESCryptoServiceProvider();
				inputByteArray = Convert.FromBase64String(this.inputString);

				MemoryStream ms = new MemoryStream();
				CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
				cs.Write(inputByteArray, 0, inputByteArray.Length);
				cs.FlushFinalBlock();
				System.Text.Encoding encoding = new System.Text.UTF8Encoding();
				this.outString=encoding.GetString(ms.ToArray());

			}
			catch(System.Exception error)
			{
				this.noteMessage=error.Message;
			}
		}
		#endregion
		#region DES加密文件
		/// <summary>
		/// DES加密文件
		/// </summary>
		/// <param name="this.inputFilePath">源文件路径</param>
		/// <param name="this.outFilePath">输出文件路径</param>
		/// <param name="encryptKey">密钥</param>
		public void FileDesEncrypt()
		{
			byte[] byKey=null; 
			byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF};
			try
			{
				byKey = System.Text.Encoding.UTF8.GetBytes(this.encryptKey.Substring(0,8));
				FileStream fin = new FileStream(this.inputFilePath, FileMode.Open, FileAccess.Read);
				FileStream fout = new FileStream(this.outFilePath, FileMode.OpenOrCreate, FileAccess.Write);
				fout.SetLength(0);
				//Create variables to help with read and write.
				byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
				long rdlen = 0; //This is the total number of bytes written.
				long totlen = fin.Length; //This is the total length of the input file.
				int len; //This is the number of bytes to be written at a time.
				DES des = new DESCryptoServiceProvider(); 
				CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);


				//Read from the input file, then encrypt and write to the output file.
				while(rdlen < totlen)
				{
					len = fin.Read(bin, 0, 100);
					encStream.Write(bin, 0, len);
					rdlen = rdlen + len; 
				}

				encStream.Close(); 
				fout.Close();
				fin.Close(); 



			}
			catch(System.Exception error)
			{
				this.noteMessage=error.Message.ToString();

			}
		}
		#endregion
		#region DES解密文件
		/// <summary>
		/// 解密文件
		/// </summary>
		/// <param name="this.inputFilePath">加密了的文件路径</param>
		/// <param name="this.outFilePath">输出文件路径</param>
		/// <param name="decryptKey">密钥</param>
		public void FileDesDecrypt()
		{
			byte[] byKey = null; 
			byte[] IV= {0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF}; 
			try
			{
				byKey = System.Text.Encoding.UTF8.GetBytes(decryptKey.Substring(0,8)); 
				FileStream fin = new FileStream(this.inputFilePath, FileMode.Open, FileAccess.Read);
				FileStream fout = new FileStream(this.outFilePath, FileMode.OpenOrCreate, FileAccess.Write);
				fout.SetLength(0);
				//Create variables to help with read and write.
				byte[] bin = new byte[100]; //This is intermediate storage for the encryption.
				long rdlen = 0; //This is the total number of bytes written.
				long totlen = fin.Length; //This is the total length of the input file.
				int len; //This is the number of bytes to be written at a time.
				DES des = new DESCryptoServiceProvider(); 
				CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);


				//Read from the input file, then encrypt and write to the output file.
				while(rdlen < totlen)
				{
					len = fin.Read(bin, 0, 100);
					encStream.Write(bin, 0, len);
					rdlen = rdlen + len; 
				}

				encStream.Close(); 
				fout.Close();
				fin.Close(); 
			}
			catch(System.Exception error)
			{
				this.noteMessage=error.Message.ToString();
			}
		}
		#endregion
		#region MD5
		/// <summary>
		/// MD5 Encrypt
		/// </summary>
		/// <param name="strText">text</param>
		/// <returns>md5 Encrypt string</returns>
		public void MD5Encrypt()
		{
            
			MD5 md5 = new MD5CryptoServiceProvider();
			byte[] result = md5.ComputeHash(System.Text.Encoding.Default.GetBytes(this.inputString)); 
			this.outString = Convert.ToBase64String(result);
		}
       
        #endregion
        #region md5函数
        public string md5(string data,string encode)
        {
            /// <summary>
            /// 与ASP兼容的MD5加密算法
            /// </summary>

            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] t = md5.ComputeHash(Encoding.GetEncoding(encode).GetBytes(data));
            StringBuilder sb = new StringBuilder(32);
            for (int i = 0; i < t.Length; i++)
            {
                sb.Append(t[i].ToString("x").PadLeft(2, '0'));
            }
            return sb.ToString();
        }
        #endregion

        public string md5Salt(string password, string salt)
        {
            /// <summary>
            /// 与ASP兼容的MD5加密算法
            /// </summary>

             StringBuilder passwordWithSalt = new StringBuilder();
            int saltLength = salt.Length;
            int j = 0;
            for (int i = 0; i < password.Length; i++)
            {
                passwordWithSalt.Append(password[i]);
                if (j < saltLength)
                {
                    passwordWithSalt.Append(salt[j]);
                    j++;
                }
            }
            byte[] hashedPassword;
            using (MD5 md5 = MD5.Create())
            {
                hashedPassword = md5.ComputeHash(Encoding.UTF8.GetBytes(passwordWithSalt.ToString()));
            }
            return Convert.ToBase64String(hashedPassword);
        }
        #region 
        /// <summary>
        /// MD5 16位加密 加密后密码为大写
        /// </summary>
        /// <param name="ConvertString"></param>
        /// <returns></returns>
        public string GetMd5Str16(string ConvertString)
        {
            try
            {
                using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
                {
                    string t2 = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 4, 8);
                    return t2.Replace("-", "").ToUpper();
                }
            }
            catch
            {
                return null;
            }
        }
		#endregion


		/// <summary>
		/// sha1算法hash密码
		/// </summary>
		/// <param name="password">密码</param>
		/// <returns></returns>
		public  string Sha1Password(string password)
		{
			using (var sha1 = new SHA1Managed())
			{
				var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(password));
				return string.Concat(hash.Select(b => b.ToString("x2")));
			}
		}

	}
}

